package org.Yiran.timetale_re.tilerender.mobrender;

import com.mojang.blaze3d.vertex.PoseStack;
import com.mojang.math.Axis;
import net.minecraft.client.Minecraft;
import net.minecraft.client.renderer.MultiBufferSource;
import net.minecraft.client.renderer.entity.EntityRenderer;
import net.minecraft.client.renderer.entity.EntityRendererProvider;
import net.minecraft.client.renderer.entity.ItemRenderer;
import net.minecraft.client.renderer.texture.OverlayTexture;
import net.minecraft.resources.ResourceLocation;
import net.minecraft.util.Mth;
import net.minecraft.world.inventory.InventoryMenu;
import net.minecraft.world.item.ItemDisplayContext;
import net.minecraft.world.item.ItemStack;
import net.minecraftforge.api.distmarker.Dist;
import net.minecraftforge.api.distmarker.OnlyIn;
import org.Yiran.timetale_re.entity.rune.ThrowableRuneEntity;
import org.jetbrains.annotations.NotNull;

/**
 * 投掷符文实体渲染器
 * <p>
 * 负责渲染投掷过程中的符文实体。该渲染器将符文实体渲染为在空中旋转的物品形式，
 * 并添加了面向运动方向和自然旋转的动画效果。
 * </p>
 * 
 * @author Yiran
 * @version 1.0
 */
@OnlyIn(Dist.CLIENT)
public class ThrowableRuneRenderer extends EntityRenderer<ThrowableRuneEntity> {

    /**
     * 构造函数
     * <p>
     * 初始化投掷符文实体渲染器。
     * </p>
     * 
     * @param context 实体渲染器提供上下文
     */
    public ThrowableRuneRenderer(EntityRendererProvider.Context context) {
        super(context);
    }

    /**
     * 渲染投掷符文实体
     * <p>
     * 将投掷符文实体渲染为在空中旋转的物品形式。渲染过程包括：
     * 1. 应用面向运动方向的朝向变换
     * 2. 应用自然旋转动画效果
     * 3. 渲染符文物品
     * </p>
     * 
     * @param entity 投掷符文实体
     * @param entityYaw 实体偏航角
     * @param partialTicks 部分刻时间（用于平滑动画）
     * @param matrixStack 矩阵栈
     * @param buffer 多重缓冲源
     * @param packedLight 打包光照值
     */
    @Override
    public void render(ThrowableRuneEntity entity, float entityYaw, float partialTicks,
                       PoseStack matrixStack, @NotNull MultiBufferSource buffer,
                       int packedLight) {
        matrixStack.pushPose();

        // 设置实体的朝向，使其面向运动方向
        matrixStack.mulPose(Axis.YP.rotationDegrees(Mth.lerp(partialTicks, entity.yRotO, entity.getYRot())));
        matrixStack.mulPose(Axis.XP.rotationDegrees(Mth.lerp(partialTicks, entity.xRotO, entity.getXRot())));

        // 添加更自然地旋转效果
        float time = entity.tickCount + partialTicks;

        // 使用缓动函数使旋转更加平滑自然
        float yawRotation = time * 25.0f;  // Y轴旋转速度
        float pitchRotation = (float) (Math.sin(time * 0.2f) * 15.0f);  // X轴旋转，带摆动效果
        float rollRotation = (float) (Math.cos(time * 0.15f) * 10.0f);   // Z轴轻微旋转增加立体感

        matrixStack.mulPose(Axis.YP.rotationDegrees(yawRotation));   // 主要旋转
        matrixStack.mulPose(Axis.XP.rotationDegrees(pitchRotation)); // 摆动效果
        matrixStack.mulPose(Axis.ZP.rotationDegrees(rollRotation));  // 轻微翻滚

        // 渲染符文物品
        ItemStack stack = entity.getRuneStack();
        if (!stack.isEmpty()) {
            ItemRenderer renderItem = Minecraft.getInstance().getItemRenderer();
            renderItem.renderStatic(stack, ItemDisplayContext.GROUND,
                    packedLight, OverlayTexture.NO_OVERLAY, matrixStack, buffer, entity.level(), 0);
        }

        matrixStack.popPose();
        super.render(entity, entityYaw, partialTicks, matrixStack, buffer, packedLight);
    }

    /**
     * 获取实体纹理位置
     * <p>
     * 返回投掷符文实体使用的纹理位置。由于使用物品渲染器渲染符文，
     * 此方法返回方块图谱纹理以满足Minecraft渲染系统的要求。
     * </p>
     * 
     * @param entity 投掷符文实体
     * @return 纹理资源位置
     */
    @Override
    public @NotNull ResourceLocation getTextureLocation(@NotNull ThrowableRuneEntity entity) {
        return InventoryMenu.BLOCK_ATLAS;
    }
}